Gre*_* A. 11 javascript asynchronous node.js babeljs ecmascript-7
我正在使用带有es7风格的异步/等待方法的babeljs.我有一个主脚本,它将在所有返回promises的对象数组上调用异步方法.我使用Promise.all()等待所有这些返回,但是,这些任务可能需要很长时间,如果它们超过阈值,我想中止所有这些,并且任务以适当的方式处理.
反正有没有完成这样的事情?目前,我能想到的唯一方法是生成一个进程,该进程执行调用这些方法的工作并等待它们全部解决,如果达到时间限制,它可以终止进程并执行它需要的任何处理.
更新:关于主脚本正在等待的这些方法的一些说明......他们可能正在进行一系列的操作(调用外部系统,某些地方的流文件等)而不执行可以独立取消的单个操作.
更新#2:一些未经测试的半伪代码
class Foo1 {
    async doSomething() {
        // call some external system
        // copy some files
        // put those files somewhere else (s3)
    }
}
class Foo2 {
    async doSomething() {
        // Do some long computations
        // Update some systems
    }
}
class FooHandler {
    constructor() {
        this.fooList = [];
    }
    async start() {
        await Promise.all(this.fooList.map(async (foo) => {
            return await foo.doSomething();
        }));
    }
}
let handler = new FooHandler();
handler.fooList.push(new Foo1());
handler.fooList.push(new Foo2());
// if this call takes too long because of slow connections, errors,   whatever,
// abort start(), handle it in whatever meaningful way, and continue on.
await handler.start();
Ben*_*aum 10
原生ES6承诺目前不支持直接取消.在许多地方一直在谈论这个问题,但它还没有.
由于本机承诺不支持它并且async/await适用于promises,因此目前没有内置的简单方法可以中止它.一种常见的方法是在创建返回promise的操作时使用令牌.
假设您已经宣传XHR GET:
// simplification
function ajax(url){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest;
        xhr.open("GET", url);
        xhr.onload = () => resolve(xhr.responseText);
        xhr.onerror = reject;
        xhr.send();
    });
}
现在你要使用它:
async function foo(){
    let result = await ajax("/myApi");
    let result2 = await ajax("/myApi2?token=" + result);
}
现在,假设我们想在某些情况下取消AJAX,我们可以传递令牌:
function ajax(url, token = {}){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest;
        xhr.open("GET", url);
        Object(token).cancel = () => { xhr.abort(), reject(); };
        xhr.onload = () => resolve(xhr.responseText);
        xhr.onerror = reject;
        xhr.send();
    });
}
这可以让你做到:
async function foo(){
    let token = {};
    let req = ajax("/myApi", token); // note no await
    // now let's say we want to abort the request since we don't 
    // need the data
    token.cancel(); // this will abort the token
}
这种方法需要与链接一起工作,幸运的是,使用ES6语法这并不是一件大事.祝你好运,编码愉快.
| 归档时间: | 
 | 
| 查看次数: | 5237 次 | 
| 最近记录: |