gpt4 book ai didi

javascript - 需要进一步的帮助来使 javascript 同步生成器处理异步函数

转载 作者:行者123 更新时间:2023-11-28 05:21:14 25 4
gpt4 key购买 nike

我是 Node JS 的相对新手。我需要同步调用异步函数(http request())。 This凯莉·辛普森 (Kylie Simpson) 的文章对我帮助很大;特别是这个代码位正是我所需要的:

function request(url) {
// this is where we're hiding the asynchronicity,
// away from the main code of our generator
// `it.next(..)` is the generator's iterator-resume
// call
makeAjaxCall( url, function(response){
it.next( response );
} );
// Note: nothing returned here!
}

function *main() {
var result1 = yield request( "http://some.url.1" );
var data = JSON.parse( result1 );

var result2 = yield request( "http://some.url.2?id=" + data.id );
var resp = JSON.parse( result2 );
console.log( "The value you asked for: " + resp.value );
}

var it = main();
it.next(); // get it all started

但我需要更进一步:我需要能够将 result1 传递给另一个函数(下面示例中的 processResult() ),然后在某些条件下该函数将调用 request()都满足了。像这样的事情:

function request(url) {
makeAjaxCall( url, function(response){
it.next( response );
} );
}

function processResult(resSet) {
if (resSet.length>100)
return request("http://some.url.1/offset100");
else
write2File(resSet);
}

function *main() {
var result1 = yield request( "http://some.url.1" );
processResult(result1)
}

var it = main();
it.next();

但是当我尝试执行此操作时,request("http://some.url.1/offset100") 不会返回任何值。有什么想法吗?

最佳答案

But when I attempt to do this, request("http://some.url.1/offset100") does not return any values.

生成器函数像任何其他函数一样同步执行,除非使用 yield 暂停它。

function processResult(resSet){} 的调用是同步调用,它会在异步 function request( url) {} 已完成。相反,您需要继续从生成器函数内部产生对异步function request(url){} 的调用。您可以通过以下方式重组代码来做到这一点:

function processResult(resSet) {
if (resSet.length>100)
return true;
else
write2File(resSet); // assuming that this function is synchronous
return false; // not necessary as the function in this case returns `undefined` by default which coerces to false - but it illustrates the point
}

function *main() {
var result1 = yield request( "http://some.url.1" );
if(processResult(result1)) {
var offset100 = yield request("http://some.url.1/offset100");
}

// do something with offset100

var it = main();
it.next();

关于javascript - 需要进一步的帮助来使 javascript 同步生成器处理异步函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40532510/

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