当 Promise outside 然后完成时做一些事情

Do something when Promise outside then finished

这是代码。

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 在此之前运行。那我出去之后怎么办呢

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

也许您可以将回调合并到 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"); });
}

您需要做的是返回一个回调,稍后您可以像这样使用它:

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();
  });
}

你的 getPromise() 它本身就是一个 Promise,所以你的 .then() 只有在它结束后才会 运行,在这种情况下,在 .finally().[=17= 之后]

您可以将 .then() 放在 getPromise() 里面,或者将 .finally() 移到 .then() 之后的外面。

不,你不能。 promise.then() returns 一个新的promise,原来的promise 无法得到那个的引用(可能是多个也可能是none,就像一棵树)

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

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()