gpt4 book ai didi

javascript - 如何在JavaScript中实现异步函数之间的依赖?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:40 25 4
gpt4 key购买 nike

作为一个简化的例子,我有两个异步函数,foobarbar 需要 foo 的结果,即 bar 依赖于 foo。我不知道哪个函数会先被调用。

  1. 如果首先调用barbar 将调用foo 并在foo 完成后立即开始。
  2. 如果 foo 先被调用并完成,bar 可以使用 foo 的结果。
  3. 如果foo先被调用,barfoo完成之前被调用,bar需要等待foo 的结果。 (不要调用对 foo 的新调用,只需等待对 foo 的已触发调用)

我怎样才能做到这一点?
是否可以注册异步函数依赖链(类似于 require.js 中的依赖 define['foo'], function() { bar(); })?
我可以使用 $.deferred() 来实现吗?
如何?

最佳答案

在这种情况下,标准方法是缓存较低级别的 promise 。

通常,您会在某个合适的外部范围内建立一个 js 普通对象作为 promise 缓存,并始终在调用您的异步进程之前首先查看那里。

var promiseCache = {};

function foo() {
if(!promiseCache.foo) {
promiseCache.foo = doSomethingAsync();
}
return promiseCache.foo;
}

function bar() {
return foo().then(doSomethingElseAsync);
}

当然,如果合适的话,没有什么可以阻止您缓存更高级别的 promise 。

function bar() {
if(!promiseCache.bar) {
promiseCache.bar = foo().then(doSomethingElseAsync);
}
return promiseCache.bar;
}

编辑:forceRefresh 功能

您可以通过传递(额外)参数强制函数刷新其缓存的 promise 。

function foo(any, number, of, other, arguments, forceRefresh) {
if(forceRefresh || !promiseCache.foo) {
promiseCache.foo = doSomethingAsync();
}
return promiseCache.foo;
}

通过将 forceRefresh 作为最后一个参数,将其省略与传递 false 相同,并且 foo 将使用缓存的 promise (如果可用)。或者,传递 true 以保证调用 doSomethingAsync() 并刷新缓存值。

编辑 2:setName()/getName()

getName() 中使用 forceRefresh 机制:

setName(newName).then(getName.bind(null, true)); //set new name then read it back using forceRefresh.

或者,省略 forceRefresh 机制,并假设缓存属性为 promiseCache.name :

setName(newName).then(function() {
promiseCache.name = $.when(newName);//update the cache with a simulated `getName()` promise.
});

第一种方法更优雅,第二种方法更高效。

关于javascript - 如何在JavaScript中实现异步函数之间的依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31988065/

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