Javascript 如何避免从承诺中提取解决方案,同时在回调之前启动流程?

Javascript 如何避免从承诺中提取解决方案,同时在回调之前启动流程?,javascript,promise,generator,Javascript,Promise,Generator,我经常发现自己使用的模式类似于: const foo = () => { const _resolve; const promise = new Promise(resolve => _resolve = resolve); myAsyncCall(_resolve); return (dataWeDontHaveYet) => promise.then(cb => cb(dataWeDontHaveYet)); } const final

我经常发现自己使用的模式类似于:

const foo = () => {
    const _resolve;
    const promise = new Promise(resolve => _resolve = resolve);
    myAsyncCall(_resolve);
    return (dataWeDontHaveYet) => promise.then(cb => cb(dataWeDontHaveYet));
}
const finalData = async2(foo());

function async2(cb) {
    ... async stuff ...
    return cb(dataWeDidntHaveBefore);
}

function myAsyncCall(cb) { return cb(somePrimitive); }
所以我有一个异步调用,我想马上开始,但是我需要用我还没有的数据解决异步调用

有点像排队

也许我不应该用承诺?我不确定。我以前用过这个,但找不到代码。目前,我正试图将一个流转换成一个生成器,但我遇到了困难


编辑:我创建了一个新问题,这是我的问题,可以在

上找到,你的语法没有真正意义,所以希望我的答案是正确的

您需要使用承诺或回调来等待异步数据。你只要把它们连在一起,然后把承诺的开头还给他们

如果
myAsyncCall()
还返回一个
承诺
,您可以执行以下操作:

return myAsyncCall();
这将返回一个
Promise
,一旦
myAsyncCall()
完成,它就会解析。如果需要转换该数据,可以将任意数量的
then()
链接到该数据上:

return myAsyncCall().then(d => transform(d));
这将首先解析
myAsyncCall()
,然后转换,然后后续
then()
调用将得到最近调用的任何内容

如果
myAsyncCall()
使用回调,则可以让回调返回一个
Promise

return new Promise((resolve) => {
  myAsyncCall(data => resolve(data));
});
这将让
myAsyncCall()
解析,然后将数据传递给
Promise
,然后用于进一步的事情


在你的更新之后,我想我对你要找的东西有了更好的了解。看起来你基本上只是想把回电和承诺联系起来

首先,看看普通的“回调”链接

const a=(开始,cb)=>cb(开始);
常数b=(输入,cb)=>cb(输入+5);
a(1,结果=>
b(结果,newResult=>
console.log(newResult)
)

);我觉得你把这条路弄得比实际需要的更复杂了。。为什么要将承诺注入函数中,而不仅仅是从函数本身返回承诺……处理大文件的压缩可能是一个挑战,尤其是当浏览器通常不这样做时。仅供参考,我正在使用JSZip库进行压缩,它最多有一个类似流的返回。*类似流的返回这不是
const
的工作方式。。您需要使用
let
,如下所述
const myAsyncCall(_resolve)
也是无效代码。这是三行不相关的代码。你能用你的方法重写我写的吗。在我看来,你的解决方案太简单了。@jasonmcarrell“太简单”lol什么?你的项目有最低复杂度标准吗?我有,但我不明白你写了什么。语法无效。您不能像调用函数一样调用
Promise
Promise(datawedonotytethave
),也不能调用
const myAsyncCall(\u resolve)
。我怀疑你正在做的事情实际上并不像你想象的那么复杂,你只需要正确地链接东西。很可能!我正在尝试解开回调,以便在不泄露解决方案的情况下链接东西。我更新了问题。谢谢。仅供参考,给你一个想法。我正在尝试将流转换为生成器,并且我已经dy将一个文件blob切片器转换成了一个生成器。这不是我的第一次牛仔竞技表演。