Ответ 1
Чтобы сохранить цепочку обещаний, вы не можете использовать 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 и затем непосредственно использовать метод .delay(x)
на вашем promises следующим образом:
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);
});