首页 新闻 会员 周边 捐助

关于Promise,为何我这样写不能得到正确的执行顺序?

0
悬赏园豆:50 [已解决问题] 解决于 2016-07-01 18:15
var test = function(){
    var exec = function(param){
        var def = $.Deferred();
        setTimeout(function(){
            console.info(param);
            def.resolve();
        }, 2000);
        return def.promise();
    }
    return exec("第一步执行").done(exec("第二步执行"));
};

test().done(function(){
    console.info("结束");
});

输出:

 

本意是想输出:第一步、第二步、结束

如果使用$.when(...)把第一步和第二步同时执行的话是可以的,但问题是这两个必须有先有后

迷惑,不解

网无忌的主页 网无忌 | 菜鸟二级 | 园豆:284
提问于:2016-06-26 15:47
< >
分享
最佳答案
0

如上,done的参数一般是一个function,而不是一个Promise。如果你想要连续执行的话,请考虑如下写法:

var test = function(){
    var exec = function(param){
        var def = $.Deferred();
        setTimeout(function(){
            console.info(param);
            def.resolve();
        }, 2000);
        return def.promise();
    }
    return exec("第一步执行").then(()=>exec("第二步执行"));
};
test().then(function(){
    console.info("结束");
});

 

收获园豆:50
幻天芒 | 高人七级 |园豆:37207 | 2016-06-27 11:19

这样确实可以!虽然IDE有错误提示,但运行没问题

求 ()=> 的解释,头一次见到,万谢!

网无忌 | 园豆:284 (菜鸟二级) | 2016-06-27 14:34

@网无忌: es6的语法,不推荐使用

Uteki | 园豆:573 (小虾三级) | 2016-06-27 16:39

@网无忌: ES6语法,建议开始时使用。如果是node平台,直接可用。否则,请用babel转换为ES5。

幻天芒 | 园豆:37207 (高人七级) | 2016-06-28 08:39
其他回答(1)
0

有两个问题

  • done接收参数是A function, or array of functions, that are called when the Deferred is resolved.
  • 如果是顺序执行,也没有必要使用deferred了
Uteki | 园豆:573 (小虾三级) | 2016-06-27 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册