gpt4 book ai didi

javascript - 我可以在 JavaScript Q 库中做出同步 promise 吗?

转载 作者:可可西里 更新时间:2023-11-01 01:32:16 24 4
gpt4 key购买 nike

我想做如下的事情:

delay( 2500 )
.then( function () { console.log( "Step 1 done" ) } )
.then( delay( 7500 ) )
.then( function () { console.log( "Step 2 done" ) } );

所以delay的实现之前已经演示过很多次了:

function delay( ms ) {
var deferred = Q.defer();
setTimeout( deferred.resolve, ms );
return deferred.promise;
}

但是如果我在 node.js 中运行上面的代码,我会得到:

... delay of 2500ms
Step 1 done
Step 2 done
... delay of ~7500ms

而不是我期望看到的:

... delay of 2500ms
Step 1 done
... delay of 7500ms
Step 2 done

https://github.com/kriskowal/q/wiki/Examples-Gallery 上提供的示例中我找不到任何与 promise 函数链接的同步函数(返回值而不涉及任何回调的函数)的示例。

关于如何将同步操作与异步 promise 混合在一起有什么想法吗?

我试过:

function synchronousPromise() {
var deferred = Q.defer();
console.log( "Synchronous function call" );
deferred.resolve();
return deferred.promise;
}

delay( 2500 )
.then( function(){synchronousPromise()} )
.then( function(){delay( 7500 )} )
.then( function(){synchronousPromise()} );

这输出:

... delay of 2500ms
Time now is 2013-06-20
Time now is 2013-06-20
... delay of 7500ms

.. 仍然不是我想要达到的目标。

最佳答案

如果您想链接回调,您必须从其中一个回调返回一个新的 promise 对象。在你的第一个例子中,你写

.then( delay( 7500 ) )

这意味着您将一个 promise 对象传递给 .then,而不是一个函数。根据Promise/A+ proposal (后面是 Q),必须忽略所有非函数参数。所以,基本上它和你写的一样:

delay( 2500 )
.then( function () { console.log( "Step 1 done" ) } )
.then( function () { console.log( "Step 2 done" ) } );

相反,传递调用 delay 并返回 promise 对象的函数:

delay( 2500 )
.then( function () { console.log( "Step 1 done" ); } )
.then( function () { return delay( 7500 ); } )
.then( function () { console.log( "Step 2 done" ); } );

现在,只有在第二个回调中 delay 返回的 promise 对象被解析后,才会调用最后一个回调。

关于javascript - 我可以在 JavaScript Q 库中做出同步 promise 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17213297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com