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

У меня есть функция createOrder, которая должна вернуть обещание. У меня есть вызовы базы данных в функции, и я хотел бы решить обещание функции createOrder, когда все действия базы данных закончены. Проблема заключается в том, что машинопись компилятор не позвольте мне вернуться обещание внутри функции базы данных возвращается обещание, потому что считает, что объявление функции (возвращает Promise) не 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

В зависимости от того, что вы делаете в «другие операции» вы либо использовать обещание, созданный путем вызова then на обещание this.db.put «s, если вы можете:

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

На самом деле вы должны добавить return из this.db.put (и все последующее выражение).

В его нынешнем виде вы вызываете this.db.put и привязываете обратный вызов в ветке then, но вы ничего не возвращаете вызывающему абоненту. Впоследствии вызывающие абоненты могут рассчитывать, что смогут получить .then от результата createOrder, но в обычном JavaScript это не удастся, так как результат будет неопределенным.

Вы также можете просто resolve(order) в .then, а не возвращать Promise массива и т.д.

Смежные вопросы