Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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 在承诺链上使用setTimeout_Javascript_Json_Promise - Fatal编程技术网

Javascript 在承诺链上使用setTimeout

Javascript 在承诺链上使用setTimeout,javascript,json,promise,Javascript,Json,Promise,在这里,我试图将我的头绕在承诺上。在第一次请求时,我获取一组链接。在下一次请求时,我获取第一个链接的内容。但我想在返回下一个承诺对象之前进行延迟。因此,我对其使用setTimeout。但它会给我以下JSON错误(,不带setTimeout()它工作正常) SyntaxError:JSON.parse:的第1行第1列处出现意外字符 JSON数据 我想知道它为什么失败? 要保持承诺链继续运行,您不能像以前那样使用setTimeout(),因为您没有从处理程序返回承诺。然后()处理程序-您从setTi

在这里,我试图将我的头绕在承诺上。在第一次请求时,我获取一组链接。在下一次请求时,我获取第一个链接的内容。但我想在返回下一个承诺对象之前进行延迟。因此,我对其使用setTimeout。但它会给我以下JSON错误(
,不带setTimeout()它工作正常

SyntaxError:JSON.parse:的第1行第1列处出现意外字符 JSON数据

我想知道它为什么失败?


要保持承诺链继续运行,您不能像以前那样使用
setTimeout()
,因为您没有从
处理程序返回承诺。然后()
处理程序-您从
setTimeout()
回调返回承诺,这对您没有好处

相反,您可以制作一个简单的小延迟函数,如下所示:

function delay(t, v) {
   return new Promise(function(resolve) { 
       setTimeout(resolve.bind(null, v), t)
   });
}
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise here that will be chained to prior promise
    return delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});
然后,像这样使用它:

function delay(t, v) {
   return new Promise(function(resolve) { 
       setTimeout(resolve.bind(null, v), t)
   });
}
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise here that will be chained to prior promise
    return delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});
在这里,您将从
.then()
处理程序返回一个承诺,因此它被适当地链接起来


您还可以向Promise对象添加延迟方法,然后直接对承诺使用
.delay(x)
方法,如下所示:

function delay(t, v) {
   return new Promise(function(resolve) { 
       setTimeout(resolve.bind(null, v), t)
   });
}
getLinks('links.txt').then(function(links){
    let all_links = (JSON.parse(links));
    globalObj=all_links;

    return getLinks(globalObj["one"]+".txt");

}).then(function(topic){
    writeToBody(topic);
    // return a promise here that will be chained to prior promise
    return delay(1000).then(function() {
        return getLinks(globalObj["two"]+".txt");
    });
});
功能延迟(t,v){
返回新承诺(函数(解析){
setTimeout(resolve.bind(null,v),t)
});
}
Promise.prototype.delay=函数(t){
返回这个。然后(函数(v){
返回延迟(t,v);
});
}
承诺。解决(“你好”)。延迟(500)。然后(函数(v){
控制台日志(v);
});
更新:

当我需要在异步函数中睡眠时,我会加入

await new Promise(resolve => setTimeout(resolve, 1000))

如果您在.then()块中,并且希望执行设置超时()

输出将如下所示

wait for 10 seconds . . . .
10 seconds Timer expired!!!
promise resolved!!!

快乐编码

答案的较短ES6版本:

const delay = t => new Promise(resolve => setTimeout(resolve, t));
然后你可以做:

delay(3000).then(() => console.log('Hello'));

在node.js中,您还可以执行以下操作:

const{promisify}=require('util'))
const delay=promisify(设置超时)
延迟(1000)。然后(()=>console.log('hello'))

请注意,
return
是特定于函数的,只返回父函数,并且不能从异步方法返回。请注意,除了使用
globalObj
之外,还有其他方法来构造此代码。
JSON.parse
抛出到哪里?我很难相信在一次
then
回调中是否有
setTimeout
会影响上一次
then
回调中的调用。这是否回答了您的问题?resolve函数是then()中的函数。所以setTimeout(resolve,t)表示setTimeout(function(){return….},t)不是吗?那么为什么它会工作呢?@AL-zami-
delay()
返回一个承诺,该承诺将在
setTimeout()
之后解析。我为setTimeout创建了一个承诺包装器,可以轻松地延迟承诺@pdem-
v
是一个可选值,您希望延迟承诺能够使用该值进行解析,从而传递承诺链
resolve.bind(null,v)
代替了
function(){resolve(v);}
两者都可以。非常感谢。。。原型延迟起作用,但函数>>>.then语句不起作用。t未定义。如果您需要
reject
选项,例如用于eslint验证,那么
const delay=ms=>new Promise((resolve,reject)=>setTimeout(resolve,ms))
我尝试了这个方法,得到了无效的参数数,在delay函数中预期为0。我可以确认它在node.js 8、10、12、13中工作。不确定您是如何运行代码的,但我只能假设
util
的填充不正确。你是在使用bundler还是什么?难道你不能像这样在异步函数中休眠吗?等待新的承诺(resolve=>setTimeout(resolve,1000))@我的朋友是个救命恩人