javascript - 如何解决nodejs中多个promise或者嵌套的问题?
阿神
阿神 2017-04-11 11:32:27
[JavaScript讨论组]

如果nodejs中连续查两次数据库,如果要求先查每1个,再查第2个,最后根据两次查询的结果做一些操作,怎么用promise实现呢?可以做到没有任何的二重嵌套吗?比如:

query({id:12}).then(function(data){
    console.log(data);
    query({id:13}).then(function(data2){
        doXXX();
    });
});


以上代码结果还是出现了嵌套。

如果这样写:


query({id:12}).then(function(data){
    console.log(data);
    
}).then(function(){
    query({id:13}).then(function(data2){
        doXXX();
    });
}).then(function(data){
    doXXXX();
});

由于第2个then有异步,还是不行的,会跑到第3个then里面去。

谢谢解答,下面代码是可以的:

var query=test.query('core_user',{userName:'lqq'});
    var array=new Array();
    query.then(function (data) {
        console.log(data);
        array.push(data[0]);
    }).then(function () {
        return test.query('core_user',{userName:'test3'});
    }).then(function (data) {
        console.log(data);
        array.push(data[0]);
        console.log(array);
        res.send(array);
    });
阿神
阿神

闭关修行中......

全部回复(7)
ringa_lee

Promise.all

阿神
return query({id: 13}).then(function(data2){
    doXXX();
}

这样OK?

天蓬老师
query({id:12}).then(function(data){
    console.log(data);
    return query({id:13})
}).then(function(data){
    doXXXX();
});
ringa_lee
query({id:12}).then(function(data){
    console.log(data);
    return query({id:13});
}).then(function(data2){
    console.log(data2);
    doXXX();
});

如果两个Promise需要前后关系的话,用上述代码,把第二个Promise return出来;
如果没有,如LS所说,用Promise.all。

黄舟

Promise.all

迷茫

http://liubin.org/promises-book/#ch2-promise-all
可以参考一下 Promise迷你书

黄舟

Promise是一种状态,之所以可以脱离callback hell的原因是如果在Promise的回调中return了另外一个Promise, 下个回调会等待上个Promise的状态变为reject或resolve.

var queryById = function(id) {
 return new Promise(function(resolve, reject) {
    //query action
    resolve(anotherId);)
});

queryById(2)
.then(function(resultId){
  return queryById(resultId);
})
.then(function(resultId2){
  return queryById(resultId2);
})

就避免了无限深入的回调

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号