2016-12-12 37 views
1
A function whose declared type is neither 'void' nor 'any' must return a value. 

我有一個createOrder函數,它應該返回一個promise。我在函數中調用了數據庫,當所有數據庫操作完成時,我想解決createOrder函數的承諾。問題是,打字稿編譯器不要讓我從數據庫裏面的函數返回承諾返回,因爲認爲該函數聲明(返回一個承諾)不fullfilled承諾:如何從函數返回不同的承諾?

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> { 
    this.db.put(newOrder) 
     .then((r)=>{ 
      //other operations 
      return new Promise<Array<Cartitem>>((resolve) => { 
       resolve(order); 
      }); 
     }) 
     .catch(function (err) { 
      console.log('put order:', err); 
      // return new Promise<Array<Cartitem>>((reject) => { 
      // reject(order); 
      // }); 
     }); 
} 

我可以返回一個承諾在函數的結尾,但這對編譯器以外的任何東西都是不利的。我應該使用簡單的回調嗎?

+0

謝謝大家,這很快! – Perrier

回答

1

您可以返回承諾爲您的函數的返回值,並在你內心的承諾回調解決它:

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> 
{ 
    return new Promise<Array<Cartitem>>((resolve) => { 
     this.db.put(newOrder) 
     .then((r)=>{ 
      //other operations 
      resolve(order); 
     }) 
     .catch((err) => { 
      console.log('put order:', err); 
      reject(err); 
     }); 
    }); 
} 
1

嘗試像

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> { 
    return this.db.put(newOrder) 
     .then((r)=>{ 
      //other operations 
      return new Promise<Array<Cartitem>>((resolve) => { 
       resolve(order); 
      }); 
     }) 
     .catch(function (err) { 
      console.log('put order:', err); 
      // return new Promise<Array<Cartitem>>((reject) => { 
      // reject(order); 
      // }); 
      return null 
     }); 

} 
3

取決於你在做什麼「等操作,」你要麼使用的由this.db.put的承諾,呼籲then如果你能創造的承諾:

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> { 
    return this.db.put(newOrder) 
     .then((r)=>{ 
      //other operations 
      return order;     // Resolves the one created by `then` 
     }) 
     .catch(function (err) { 
      console.log('put order:', err); 
      throw err;      // Rejects the one created by `then` 
     }); 
    }); 
} 

...或者如果您由於某種原因不能,請儘早創建您的承諾,並在其初始化回調中撥打電話this.db.put

createOrder(order:Array<Cartitem>, sum:number):Promise<Array<Cartitem>> { 
    return new Promise<Array<Cartitem>>((resolve) => { 
     this.db.put(newOrder) 
      .then((r)=>{ 
       //other operations 
       resolve(order); 
      }) 
      .catch(function (err) { 
       console.log('put order:', err); 
       reject(err); // You had `order` here, but presumably it would be `err` 
      }); 
    }); 
} 
1

實際上,您應該添加returnthis.db.put(以及後面的整個表達式)。

現在,您正在調用this.db.put,並在then分支中鏈接一個回調函數,但是您沒有返回任何內容給調用者。隨後,調用者可能希望能夠.then關閉createOrder的結果,但在普通的舊JavaScript中,它會失敗,因爲結果將是未定義的。

您也可以在.then只是resolve(order),而不是返回數組的承諾等