javascript - nodejs能否等待异步执行结束
PHP中文网
PHP中文网 2017-04-11 12:43:21
[JavaScript讨论组]

现在是有好几个函数,里面都是执行异步函数。

我就想把这个函数里面的值返回,当然嘛,由于是异步,还没等执行完就关了,所以外面也拿不到值。

之前是问了前端说是传进去你想执行的方法,或者值就行了,一步步往进传。

后来我用了promise,虽然这玩意是能帮助我分开,

但是我现在在第一个的then里又是一个返回promise的函数,又得then,还是造成了层层嵌套。

用了链式也就那样。虽然这三个函数是有顺序的,但是有时候不是需要第一个函数,
但不一定要前两个执行,就是我这后两个都是通过传参数进去来执行相应的方法。
用promise不就绑死了吗。

难道我要写两个链式,分别是123 23 。这样的话不就冗余了吗。

有没有什么依赖可以帮助解决这个问题

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(5)
PHP中文网

试试使用co模块或者用es7的await函数

天蓬老师

非要用async await么。
感觉语义的清晰程度上是不如.then.then.then的

巴扎黑

理论上说 Promise 会嵌套,但不是层层嵌套,比如

new Promise( resolve => {
  doFirstThing( err => {
    resolve();    
  })
})
  .then( () => {
    return new Promise( resolve => {
      doSecondThing( err => {
        resolve();
      });
    });
  })
  .then( () => {
    return new Promise( resolve => {
      doThirdThing(err => {
        resolve();
      });
  })
  .then( () => {
    doOtherThings();
  })
  .catch( err => {

  });

如果还要其它东西,就顺序增加就是了。


更新:

如果有时候 ABC,有时候 BC,可以使用 Promise.resolve() 方法。

let first = condition ? Promise.resolve(condition) : doFirst();
first.then( () => {
  return second();
})
  .then( () => {
    return third();
  })
  ....
黄舟

使用ES7的async/await语法吧。

这个语法的设计理念就是等异步任务完成再往下运行代码。相当于用同步的方式来写处理异步代码!和你想要的一样。不过,它也是要借助Promise这个东西。

大家讲道理
function A(callback){
    setTimeout(function(){
        var resultValue="AAA";
        if(Math.floor(Math.random()*10)%2){
           resultValue="AAA";
        }else{
            resultValue="AAAA";
        }
        callback&&callback.apply(null,[resultValue]);
    },1000);
}

function B(input_value,callback){
    setTimeout(function(){
        callback&&callback.apply(null,["BBB"]);
    },1000);
}


function C(input_value,callback){
    setTimeout(function(){
        callback&&callback.apply(null,["CCC"]);
    },1000);
}

var promiseA=new Promise(function(resolve,reject){
   A(function(resultValue){
       resolve(resultValue);
   });
});

var promiseB=promiseA.then(function(resultValueA){
    if(resultValueA=="AAA"){
        
        return new Promise(function(resolve,reject){
            //执行B
            B(resultValueA,function(result){
                console.log("~~执行B~~");
                resolve(result);
            });
        });
    }else if(resultValueA=="AAAA"){
        return new Promise(function(){
            //或者执行C
            C(resultValueA,function(result){
                console.log("~~执行C~~");
                resolve(result);
            });
        });
        
    }
});

promiseB.then(function(result){
    console.log("~~~BBB~~~"+result);
});

先执行A函数,根据A函数的返回结果根据逻辑执行B还是C

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

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