【问题标题】:Do something when Promise outside then finished当 Promise 在外面然后完成时做一些事情
【发布时间】:2022-01-19 15:15:14
【问题描述】:

这里是代码。

function getPromise():Promise<any> {
    let p = new Promise<any>((resolve, reject) => {
        //some logical
        resolve(data);
    });
    p.finally(()=>{ 
        //I want do something when outside then finished! 
        console.log("finally hit");
    });
    return p;
}

function doPromise():void {
    a.getPromise().then(data => { console.log("then hit"); });
}

但 finally 在此之前运行。那么在外面之后我该怎么做呢。

我不想在那之后添加finally,因为promise调用了很多地方。所以我想在一个地方做。

【问题讨论】:

标签: javascript typescript promise


【解决方案1】:

你要做的是重新运行一个回调,你可以像这样在以后使用它:

type GetPromise = {
  p: Promise<any>;
  finalCallback: () => void;
}
function getPromise():GetPromise {
  let p = new Promise<any>((resolve, reject) => {
      //some logical
      resolve(data);
  });
  finalCallback(()=>{ 
      //I want do something when outside then finished! 
      console.log("finally hit");
  });
  return {p, finalCallback};
}

function doPromise():void {
  const {p: promise, finalCallback} = getPromise()
  promise().then(data => { 
    console.log("then hit");  
    finalCallback();
  });
}

【讨论】:

  • 我不希望调用者执行它。我想自动执行它。但这是实现它的聪明方法。谢谢。
【解决方案2】:

也许您可以将回调合并到getPromise


function getPromise(callback):Promise<any> {
    let p = new Promise<any>((resolve, reject) => {
        //some logical
        resolve(data);
    });
    p.then(callback)
    p.finally(()=>{ 
        //I want do something when outside then finished! 
        console.log("finally hit");
    });
    return p;
}

function doPromise():void {
    getPromise(data => { console.log("then hit"); });
}

【讨论】:

  • 是的,但我认为没有必要再返回 Promise。如果方法 getPromise 带有 then,会在 finally 之后调用。
  • @oudi 有时你想在promise之后继续工作,所以你必须返回它
【解决方案3】:

您的 getPromise() 本身就是一个 Promise,因此您的 .then() 只会在它结束后运行,在这种情况下,在 .finally() 之后。

您可以将.then() 放在getPromise() 内部或将.finally() 移到.then() 之后的外部。

【讨论】:

    【解决方案4】:

    不,你不能。 promise.then() 返回一个新的 Promise,原来的 promise 无法获得它的引用(可能是多个也可能没有,它就像一棵树)。

    相反,您可以将console.log("then hit") 提供给getPromise() 作为回调,在创建promise 期间使用。

    function getPromise(cb) {
        let p = new Promise((resolve, reject) => {
            //some logical
            resolve();
        });
        p.then(cb).finally(()=>{ 
            //I want do something when outside then finished! 
            console.log("finally hit");
        });
        return p;
    }
    function doPromise() {
        getPromise(data => { console.log("then hit"); });
    }
    
    doPromise()

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多