在这里,我试图绕过Promise.Here在第一个请求时获取一组链接。在下一个请求时,我获取第一个链接的内容。但是我想在返回下一个Promise对象之前进行延迟。所以我使用setTimeout就可以了,但是它给了我下面的JSON错误(
without setTimeout() it works just fine
)
SyntaxError:JSON.parse:JSON数据的第1行第1列出现意外字符
我想知道为什么会失败?
let globalObj={};
function getLinks(url){
return new Promise(function(resolve,reject){
let http = new XMLHttpRequest();
http.onreadystatechange = function(){
if(http.readyState == 4){
if(http.status == 200){
resolve(http.response);
}else{
reject(new Error());
}
}
}
http.open("GET",url,true);
http.send();
});
}
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);
setTimeout(function(){
return getLinks(globalObj["two"]+".txt"); // without setTimeout it works fine
},1000);
});
为了保持承诺链的进行,您不能使用setTimeout()
您的方式,因为您没有从.then()
处理程序中返回承诺-
您正在从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");
});
});
在这里,您从.then()
处理程序返回了一个Promise ,因此它被适当地链接了。
您还可以向Promise对象添加一个delay方法,然后.delay(x)
对您的promise 直接使用一个方法,如下所示:
function delay(t, v) {
return new Promise(function(resolve) {
setTimeout(resolve.bind(null, v), t)
});
}
Promise.prototype.delay = function(t) {
return this.then(function(v) {
return delay(t, v);
});
}
Promise.resolve("hello").delay(500).then(function(v) {
console.log(v);
});
或者,使用已经内置方法的Bluebird
Promise库.delay()
。
问题内容: 我有一个名为PaymentStrategy的服务,已注入我的控制器中。 paymentStrategy中的这种购买方法会触发几种需要顺序调用的方法。当buy()中的所有方法都完成后,需要调用then()。 这可能是微不足道的,但我对棱角还很陌生。 目前,在init()方法之后立即触发buy()。then()。我觉得我们需要将所有这些方法放在一个promise中,并应用$ q.all()
问题内容: 我正在做的事情涉及按顺序运行(进行一些设置,然后运行调用者感兴趣的实际命令),然后进行一些清理)。 就像是: 哪里是这样的: 在内部,我使用,它返回,并且有效地将事件的结果从返回给调用者。 现在,我还需要将事件从stdout和stderr发送到调用者,这些事件也来自EventEmitters。是否有一种方法可以使(Bluebird)Promises正常工作,或者它们只是妨碍发出多个事件
问题内容: 我这样承诺 返回一个promise,yes 不能被修改 。 我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?) 问题答案: 我想你不想在这里连锁。以同步的方式,您会写 这就是应如何将其转化为承诺: 诺言没有实现。
问题内容: 我需要创建链式承诺: 如果我将errorCallback放在第一个中,则第二个将被解析,并调用其successCallback。但是,如果我删除了,那么第二个承诺将被拒绝。 根据Angular JS的文档,传播拒绝的唯一方法是返回并且它看起来并不明显,尤其是因为即使不需要它,我也必须注入服务。 也可以通过在中引发异常来完成此操作,但是它将异常跟踪写入控制台,这不好。 还有另一种选择可以
"网上电台"用户使用承诺条款 网上电台(Internet Radio)的使用可能需要通过有线或无线LAN的宽带网络连接。宽带网络连接并不是与Internet Radio同时提供。 您的所在地可能没有宽带网络连接。宽带网络连接可能不是免费或出现干扰或断线的情况。详情请询问您的服务提供商。 您必需于使用网上电台时遵守所有适用法律、法规及许可限制, 包括尊重Sony Computer Entertain
问题内容: 关于这两个重要来源:NZakas- 承诺链中的归还承诺 和MDN承诺,我想提出以下问题: 每次我们从承诺履行处理程序返回值时,该值如何传递给从同一处理程序返回的新承诺? 例如, 在这个例子中,是一个承诺。也是来自履行处理程序的承诺。但是。取而代之的是神奇地解决(如何?),然后将该值传递给的实现处理程序。即使是这里的句子也令人困惑。 您能给我解释一下这到底是怎么回事吗?我对这个概念感到困