为什么在这种情况下return没有解析?
为什么在这种情况下return没有解析?
考虑以下两个例子...
测试1
function test1() { return new Promise(function () { return 123; }); } test1() .then(function (data) { console.log("数据:", data); return 456; }) .then(function (value) { console.log("值:", value); });
它不会输出任何内容。
测试2
function test2() { return new Promise(function (resolve, reject) { resolve(123); }); } test2() .then(function (data) { console.log("数据:", data); return 456; }) .then(function (value) { console.log("值:", value); });
它输出:
数据: 123 值: 456
为什么在测试1中,一个Promise构造函数不仅仅解析返回的值会有哪些缺点或规范矛盾?
为什么它必须与测试2中的结果不同?
我试图理解一个构造的Promise对象与一个符合promise规范的thenable对象有何不同。
为什么在这种情况下return不起作用?
在使用Promise时,传递给Promise的函数不是onFulfilled或onRejected的回调函数,而是被称为executor的函数。可以将其视为promise试图捕获的异步上下文。在异步方法中使用return不起作用(或者没有意义),因此必须调用resolve或reject来解决该问题。例如:
var returnVal = new Promise(function() { return setTimeout(function() { return 27; }); });
上述代码并不能按预期工作。如果在异步调用完成之前从executor中返回一个值,那么promise就无法被重新解决。
另外,这也可能与函数末尾的隐式return undefined冲突。考虑一下以下两个执行器以相同方式工作的情况:
// A function a() { return undefined; } // B function b() { }
这两个函数会返回相同的结果。
a() === b(); // true
那么,如何告诉Promise构造函数您真正希望使用undefined来解决Promise呢?
解决方法是在executor中调用resolve或reject来解决Promise。这样可以明确地指示Promise的解决值。
var returnVal = new Promise(function(resolve) { setTimeout(function() { resolve(27); }); });
在这个问题中,return语句无法解决的原因是因为在创建Promise对象时,没有调用resolve或reject方法来处理Promise的状态。相反,可以使用Promise.resolve方法来返回一个已解决的Promise对象。
Promise.resolve是一个返回已解决Promise对象的快捷方式。相比于手动创建一个Promise对象并调用resolve方法,直接使用Promise.resolve可以更简洁和高效。
在上述代码中,return new Promise(function (resolve, reject) { resolve(123); }); 可以简化为 return Promise.resolve(123);。两者的结果相同,但底层的实现方式不同。后者的性能更好,尤其是在某些Promise实现中。
因此,解决这个问题的方法是使用Promise.resolve来返回一个已解决的Promise对象。
通过使用Promise.resolve方法可以更简洁和高效地返回一个已解决的Promise对象,而不需要手动创建一个Promise对象并调用resolve方法来解决Promise的状态。