首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Node.js的承诺然后回来?

关于Node.js的承诺然后回来?
EN

Stack Overflow用户
提问于 2017-03-31 11:57:57
回答 2查看 6.2K关注 0票数 3

我对承诺感到困惑!

我使用承诺,然后不返回,如下所示:

代码语言:javascript
复制
new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1");
    new Promise((resolve, reject) => {
        //Time-consuming operation, for example: get data from database;
        setTimeout(() => {
            resolve(2)
        }, 3000);
    }).then((v11) => {
        console.log("v11");
    })
}).then((v2) => {
    console.log("v2")
});

我得到了这个结果,v1 v2 v11。然后,我使用另一种写作方式,如下所示:

代码语言:javascript
复制
 new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1");
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, 3000)
    }).then((v11) => {
        console.log("v11");
    })
}).then((v2) => {
    console.log("v2")
});

我得到了另一个结果,v1 v11 v2

也许还有另外一种情况:

代码语言:javascript
复制
new Promise((resolve, reject) => {
resolve("1");
}).then((v1) => {
console.log("v1");
return new Promise((resolve, reject) => {
    setTimeout(() => {resolve(2)}, 3000)
}).then((v11) => {
    console.log("v11");
    return new Promise((resolve, reject) => {
        setTimeout(() => {resolve(2)}, 4000)
    }).then(() => {
        console.log("v12")
    })
})
}).then((v2) => {
console.log("v2")
});

我得到了这个结果v1 v11 v12 v2

我不明白第二个返回,我想知道为什么会得到这个结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-31 12:43:30

如果实际打印已解析的承诺的值,而不仅仅是变量的名称,将更容易理解控制流:

版本1

代码语言:javascript
复制
new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1:", v1);
    new Promise((resolve, reject) => {
        //Time-consuming operation, for example: get data from database;
        setTimeout(() => {
            resolve(2)
        }, 3000);
    }).then((v11) => {
        console.log("v11:", v11);
    })
}).then((v2) => {
    console.log("v2:", v2)
});

第2版

代码语言:javascript
复制
new Promise((resolve, reject) => {
    resolve("1");
}).then((v1) => {
    console.log("v1:", v1);
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve(2)
        }, 3000)
    }).then((v11) => {
        console.log("v11:", v11);
    })
}).then((v2) => {
    console.log("v2:", v2)
});

第3版

代码语言:javascript
复制
new Promise((resolve, reject) => {
        resolve("1");
}).then((v1) => {
       console.log("v1:", v1);
       return new Promise((resolve, reject) => {
           setTimeout(() => {resolve(2)}, 3000)
       }).then((v11) => {
           console.log("v11:", v11);
           return new Promise((resolve, reject) => {
               setTimeout(() => {resolve(2)}, 4000)
           }).then((v12) => {
              console.log("v12:", v12)
           })
       })
 }).then((v2) => {
      console.log("v2:", v2)
 });

现在,您可以看到传递给回调的内容:

结果1

代码语言:javascript
复制
v1: 1
v2: undefined
v11: 2

结果2

代码语言:javascript
复制
v1: 1
v11: 2
v2: undefined

结果3

代码语言:javascript
复制
v1: 1
v11: 2
v12: 2
v2: undefined

解释

正如您可以看到,在.then()处理程序中,当您不返回一个承诺时,它的作用就好像您返回了一个带有值undefined的已解析的承诺--就像您返回了这样的承诺:

代码语言:javascript
复制
return Promise.resolve(undefined);

因此,可以立即调用下一个.then()处理程序。

另一方面,如果您返回一个尚未解决的承诺,那么下一个.then()处理程序将不会立即被调用,而只有在返回的诺言被解决之后。

这就解释了当你不回承诺的时候,执行的顺序是不同的--而发生的事情就好像一个已经解决的承诺被隐式地回报给你一样。

票数 5
EN

Stack Overflow用户

发布于 2020-01-03 05:14:54

代码语言:javascript
复制
    function one() {
    return new Promise((resolve,reject) => {
        setTimeout(function () {
            console.log("one 1 ");
            resolve('one one');
        }, 2000);
    });
}

function two() {
    return new Promise((resolve,reject) => {
        setTimeout(function () {
            console.log("two 2 ");
            resolve('two two');
        }, 10000);
    });
}

function three(){
    setTimeout(function () {
        console.log("three 3 ");
    }, 5000);
}

one().then((msg) => {
        console.log('one : ', msg);
        return two();
    }).then((msg) => {
        console.log('two :', msg);
        return three();
    }).then((msg) => {
        console.log('three :', msg);
    })
    .catch((error) => {
        console.error('Something bad happened:', error.toString());
    });

控制台三显示未定义,因为三个不解析解析

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43140118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档