自定义函数

6rqinv9w  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(440)

下面是一个代码示例:

var promise = new Promise((resolve, reject) => {
  resolve("resolved");
});

promise.abort = function () {
  console.log("abort!");
};

console.log(promise.abort());

function bar() {
  return promise.then((value) => {
    return value + "!";
  });
}

newPromise = bar();
newPromise.then(value => {
  console.log(value);
})

console.log(newPromise.abort());

我在承诺中添加了一个自定义函数。调用函数 abort() 工作正常。在函数中 bar() 我使用 then() 方法注销解析的值。我知道 bar() 这是一个新的承诺。但它失去了自定义功能 abort() .
如何将自定义函数继承到新的promise?

4ngedf3f

4ngedf3f1#

创建您自己的类并为本机promise创建子类。然后您可以将自定义方法保留为 .then() 将返回自定义类

class MyPromise extends Promise {
  abort() {
    console.log("abort!");
  }
}

var promise = new MyPromise((resolve, reject) => {
  resolve("resolved");
});

console.log(promise.abort());

function bar() {
  return promise.then((value) => {
    console.log(value);
  });
}

newPromise = bar();

console.log(newPromise.abort());
dkqlctbz

dkqlctbz2#

您不能取消/中止承诺。一种方法是编写泛型 timeout 或类似的功能来处理长期的承诺-

function sleep(ms) {
  return new Promise(r => setTimeout(r, ms))
}

function timeout(p, ms) {
  const orFail = sleep(ms).then(_ => { throw Error("timeout") })
  return Promise.race([ p, orFail ])
}

async function testTask(value) {
  await sleep(3000)
  return value
}

timeout(testTask("hello"), 5000)
  .then(console.log, console.error) // "hello"

timeout(testTask("world"), 1000)
  .then(console.log, console.error) // Error "timeout"

另一种方法是使用支持取消的第三方库,如bluebird-

import { Promise } from "bluebird"

function makeCancellableRequest(url) {
    return new Promise(function(resolve, reject, onCancel) {
        var xhr = new XMLHttpRequest();
        xhr.on("load", resolve);
        xhr.on("error", reject);
        xhr.open("GET", url, true);
        xhr.send(null);
        // Note the onCancel argument only exists if cancellation has been enabled!
        onCancel(function() {
            xhr.abort();
        });
    });
}

相关问题