Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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_Deferred_Q - Fatal编程技术网

Javascript 如何简化Q承诺示例

Javascript 如何简化Q承诺示例,javascript,promise,deferred,q,Javascript,Promise,Deferred,Q,我正在开发一个简单的应用程序,它可以使 ajax调用,将第一个调用的结果传递给下一个调用 我当然不想进地狱, 因此,请查看规范和示例 我已经准备了一个异步函数,它将产生我想要的结果。 但我想了解如何简化顺序承诺传递 现在我还在读关于如何最好地处理承诺和延迟目标的书,所以请原谅 我非常天真的代码 现在我看两件事: 简化承诺顺序的方法(取决于一个承诺) 另一个(如我的情况) 建议 var modifyableObject = { toProcess : ["one", "two", "th

我正在开发一个简单的应用程序,它可以使 ajax调用,将第一个调用的结果传递给下一个调用

我当然不想进地狱, 因此,请查看规范和示例

我已经准备了一个异步函数,它将产生我想要的结果。 但我想了解如何简化顺序承诺传递

现在我还在读关于如何最好地处理承诺和延迟目标的书,所以请原谅 我非常天真的代码

现在我看两件事:

  • 简化承诺顺序的方法(取决于一个承诺) 另一个(如我的情况)
  • 建议

    var modifyableObject = {
        toProcess : ["one", "two", "three", "four", "five"]
    }
    
    
    function returnsDeferredResults(someResult) {
    
        var deferred = Q.defer();
    
        // my async function (setTimeout for now will do, $.ajax() later)
        setTimeout(function () {
    
            var nextResult = (someResult || " Initial_Blank_Value ") + "..." + modifyableObject.toProcess[0]; 
    
            modifyableObject.toProcess = modifyableObject.toProcess.splice(1);
    
            console.log("New Tick Result: ", nextResult, "Array: ", modifyableObject.toProcess);
    
            deferred.resolve( nextResult);
    
        }, 200);
    
        return deferred.promise;
    }
    
    
    //$("#test_promise").click(function () {
    
        function getDeferredResult(prevResult) {
            return returnsDeferredResults(prevResult);
        }
    
        var prevResult = getDeferredResult();
    
        var nextTick = "";
    
        for (var i = modifyableObject.toProcess.length; i > 1; i --) {
    
            if (nextTick) 
                nextTick = nextTick.then(getDeferredResult);
            else 
                nextTick = prevResult.then(getDeferredResult);
        }
    
        //nextTick.fin(function(){ ...});
    
    //});
    
    
    
    /*
    New Tick Result:   Initial_Blank_Value ...one           Array:  ["two", "three", "four", "five"]
    New Tick Result:   Initial_Blank_Value ...one...two            Array:  ["three", "four", "five"]
    New Tick Result:   Initial_Blank_Value ...one...two...three             Array:  ["four", "five"] 
    New Tick Result:   Initial_Blank_Value ...one...two...three...four              Array:  ["five"]
    New Tick Result:   Initial_Blank_Value ...one...two...three...four...five             Array:  [] 
    */
    

提前谢谢大家

您可以通过组合两个变量简化循环:

var nextTick = getDeferredResult();

for (var i = modifyableObject.toProcess.length; i > 1; i --) {
    nextTick = nextTick.then(getDeferredResult);
}
或者


您也可以简化您的功能:

return Q.delay(200).then(function) { 
    return "..." + modifyableObject.toProcess.shift();
});
jQueryAjax还返回一个承诺,Q与之兼容(在jQuery的最新版本中)

然后,通过将每个项传递给函数,可以将这两项改进结合起来:

return modifyableObject.toProcess.reduce(function(promise, item) {
    return promise.then(processItem.bind(null, item));
}, Q.resolve());

function processItem(item) {
    return Q.delay(200).then(function) { 
        return "..." + modifyableObject.toProcess.shift();
    });
}

您可以通过组合两个变量来简化循环:

var nextTick = getDeferredResult();

for (var i = modifyableObject.toProcess.length; i > 1; i --) {
    nextTick = nextTick.then(getDeferredResult);
}
或者


您也可以简化您的功能:

return Q.delay(200).then(function) { 
    return "..." + modifyableObject.toProcess.shift();
});
jQueryAjax还返回一个承诺,Q与之兼容(在jQuery的最新版本中)

然后,通过将每个项传递给函数,可以将这两项改进结合起来:

return modifyableObject.toProcess.reduce(function(promise, item) {
    return promise.then(processItem.bind(null, item));
}, Q.resolve());

function processItem(item) {
    return Q.delay(200).then(function) { 
        return "..." + modifyableObject.toProcess.shift();
    });
}

我真的不明白你为什么在这里使用承诺。他们的观点应该是不再需要像
modifyableObject
这样的全局代码。这只是一个简化的原型代码,并将其放入“全局”范围。我将使用
$.ajax()
而不是
setTimeout
函数,并且
modifyableObject
将被替换为需要传递到
$.ajax()
调用中的数据。我真的不明白为什么在这里使用承诺。他们的观点应该是不再需要像
modifyableObject
这样的全局代码。这只是一个简化的原型代码,并将其放入“全局”范围。我将使用
$.ajax()
而不是
setTimeout
函数,并且
modifyableObject
将被替换为我需要传递到
$.ajax()
调用中的数据。哇,这是一个很棒的响应!我真的很喜欢你使用promise上的reduce函数和push-then方法。这就是我想要的:这是一个非常棒的模式;它应该记录在Q文档中,IMO.wow,这是一个非常棒的响应!我真的很喜欢你使用promise上的reduce函数和push-then方法。这就是我想要的:这是一个非常棒的模式;应将其记录在IMO的Q文件中。