Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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承诺-传播和添加其他方法_Javascript_Node.js - Fatal编程技术网

Javascript承诺-传播和添加其他方法

Javascript承诺-传播和添加其他方法,javascript,node.js,Javascript,Node.js,是否可以执行以下功能 const method = () => { let _reject; const promise = new Promise((resolve, reject) => { _reject = reject; ... }); return { ...promise, cancel: () => _reject('cancelled'), } } i、 e.我可以

是否可以执行以下功能

const method = () => {
    let _reject;
    const promise = new Promise((resolve, reject) => {
      _reject = reject;
      ...
    });
  
    return {
      ...promise,
      cancel: () => _reject('cancelled'),
    }
}
i、 e.我可以做如下事情:

const promise = method();
// now I have promise.then, promise.catch and promise.cancel
这只是一个例子;我希望能够向这个“承诺”对象添加额外的属性。

看到这个答案了吗

您可能需要扩展专门的Promise类

class CancelablePromise扩展了承诺{
取消(){}
}

不,您不能传播promise实例,因为它会失去其原型(方法),但您可以像添加任何对象一样向其添加属性:

promise.cancel = () => _reject('cancelled');
return promise;

(请注意,我并不是说这是个好主意)

您可以执行以下操作:

const _resolve= Symbol('resolve');
const _reject= Symbol('reject');

class ExPromise extends Promise{
    constructor(executor) {
        let resolve, reject;

        super((_resolve, _reject) => {
            resolve = _resolve;
            reject = _reject;
            executor(resolve, reject);
        });

        this[_resolve]= resolve;
        this[_reject]= reject;
    }

    cancel(){
        this[_reject](new Error('canceled'));
    }
}

如果需要取消嵌套的承诺或其他一些额外功能,可以尝试该包

请记住,这个假设的
cancel()
方法实际上不会终止承诺构造函数启动的异步代码。