为什么在这种情况下return没有解析?

13 浏览
0 Comments

为什么在这种情况下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对象有何不同。

0
0 Comments

为什么在这种情况下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);
     });
});

0
0 Comments

在这个问题中,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的状态。

0