javascript - 我如何用 q 做一个回调链?

标签 javascript asynchronous callback promise q

我在理解如何使用“q”(https://github.com/kriskowal/q) 一个用于 javascript 的 promise 库时遇到了一些问题:

var delayOne = function() {
    setTimeout(function() {
        return 'hi';
    }, 100);
};

var delayTwo = function(preValue) {
    setTimeout(function() {
        return preValue + ' my name';
    }, 200);
};

var delayThree = function(preValue) {
    setTimeout(function() {
        return preValue + ' is bodo';
    }, 300);
};

var delayFour = function(preValue) {
    setTimeout(function() {
        console.log(preValue);
    }, 400);

};

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).end();

这只会返回未定义的...

最佳答案

正如 wroniasty 所指出的,您需要从这些函数中的每一个返回一个 promise ,但您还应该尽可能抽象任何面向回调的 API(如 setTimeout)并使用返回 promise 的 API相反。

setTimeout 的情况下,Q 已经提供了 Q.delay(ms) ,它返回一个将在指定的毫秒数后解决的 promise ,非常适合替换设置超时:

var delayOne = function() {
    return Q.delay(100).then(function() {
        return 'hi';
    });
};

var delayTwo = function(preValue) {
    return Q.delay(200).then(function() {
        return preValue + ' my name';
    });
};

var delayThree = function(preValue) {
    return Q.delay(300).then(function() {
        return preValue + ' is bodo';
    });
};

var delayFour = function(preValue) {
    return Q.delay(400).then(function() {
        console.log(preValue);
    });
};

Q.fcall(delayOne).then(delayTwo).then(delayThree).then(delayFour).done();

(注意:end 已替换为 done)

关于javascript - 我如何用 q 做一个回调链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461589/

相关文章:

从异步闭包内部调用的 Swift 函数也是异步的?

python - 了解异步 : Asynchronous vs synchronous callbacks

android - 如何将变量从可观察值返回到另一种可观察类型

javascript - 匿名函数 ("callbacks") 内的函数是否会在每次回调时在内存中重新定义?

javascript - 有没有比为此设置变量更好的方法?

javascript - 更改 HTML 中的文本 选择选项

Javascript knockout 绑定(bind)嵌套对象不起作用

javascript - Array.from() 与传播语法

javascript - 将多行从一个表拖放到另一个表

python - 在 Python 类中使用鼠标事件回调