Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中使用Q顺序运行承诺?_Javascript_Promise_Q - Fatal编程技术网

如何在Javascript中使用Q顺序运行承诺?

如何在Javascript中使用Q顺序运行承诺?,javascript,promise,q,Javascript,Promise,Q,我很难按顺序完成任务 var getDelayedString = function(string) { var deferred = Q.defer(); setTimeout(function() { document.write(string+" "); deferred.resolve(); }, 500); return deferred.promise; }; var onceUponATime = functio

我很难按顺序完成任务

var getDelayedString = function(string) {
    var deferred = Q.defer();

    setTimeout(function() {
        document.write(string+" ");
        deferred.resolve();
    }, 500);

    return deferred.promise;
};

var onceUponATime = function() {
    var strings = ["Once", "upon", "a", "time"];

    var promiseFuncs = [];

    strings.forEach(function(str) {
        promiseFuncs.push(getDelayedString(str));
    });

    //return promiseFuncs.reduce(Q.when, Q());
    return promiseFuncs.reduce(function (soFar, f) {
        return soFar.then(f);
    }, Q());    
};

getDelayedString("Hello")
.then(function() {
    return getDelayedString("world!")
})
.then(function() {
    return onceUponATime();
})
.then(function() {
    return getDelayedString("there was a guy and then he fell.")
})
.then(function() {
    return getDelayedString("The End!")
})
onceUponATime()应该按顺序输出[“Once”、“on”、“a”、“time”],但由于某种原因,它们会立即被输出

请点击此处:

知道我做错了什么吗

但由于某种原因,它们被立即输出

你已经在这里给他们打电话了:

promiseFuncs.push(getDelayedString(str));
//                                ^^^^^
您需要按下
函数(){return getDelayedString(str);}
。顺便说一句,不要在
每个
循环中使用推送数组,而应该使用。实际上,您实际上并不需要这样做,但可以通过
字符串
数组直接
减少

function onceUponATime() {
    var strings = ["Once", "upon", "a", "time"];

    return strings.reduce(function (soFar, s) {
        return soFar.then(function() {
            return getDelayedString(s);
        });
    }, Q());    
}

哦,还有。

谢谢您的回答和其他提示!是的,它必须是一个函数工厂才能工作,否则它会立即执行。