Javascript 履行承诺的麻烦

Javascript 履行承诺的麻烦,javascript,typescript,promise,es6-promise,Javascript,Typescript,Promise,Es6 Promise,用户将单击一个按钮,该按钮将调用: private _saveJobCreate(): void { if ((this.state.jobToCreate.TruckLookUpId && this.state.jobToCreate.TruckLookUpId !== undefined) && (this.state.jobToCreate.DeliveryDate && this.state.jobToCreate.Delive

用户将单击一个按钮,该按钮将调用:

private _saveJobCreate(): void {
  if ((this.state.jobToCreate.TruckLookUpId && this.state.jobToCreate.TruckLookUpId !== undefined) &&
    (this.state.jobToCreate.DeliveryDate && this.state.jobToCreate.DeliveryDate.length > 0)) {
    console.log("valid input, should save");

    this._createJob(this.state.jobToCreate)
      .then(() => {
        console.log("job created and should be fetched, hiding panel");
        this._hideJobCreatePanel();
      });
  }
}
它调用此方法:

private _createJob(newJob: IDeliveryJob): Promise < void > {
  console.log("creating job");
  let promise: Promise < void > = new Promise < void > ((resolve, reject) => {
    this.props.deliveryJobService.createJob(newJob)
      .then(() => {
        console.log("job created, fetching jobs");
        this._fetchJobs()
          .then(() => {

          });
      });
  });
  return promise;
}
private\u createJob(newJob:IDeliveryJob):承诺{
console.log(“创建作业”);
让承诺:承诺=新承诺((决定,拒绝)=>{
this.props.deliveryJobService.createJob(newJob)
.然后(()=>{
log(“创建作业,获取作业”);
这个。_fetchJobs()
.然后(()=>{
});
});
});
回报承诺;
}
将从Sharepoint列表中获取我的作业:

private _fetchJobs(): Promise < void > {
  console.log("fetching jobs");
  let promise: Promise < void > = new Promise < void > ((resolve, reject) => {
    this.props.deliveryJobService.getDeliveryJobs()
      .then((newJobs: IDeliveryJob[]) => {
        console.log("jobs fetched, setting state");
        this.setState({
          jobs: newJobs
        });
      });
  });
  return promise;
}
private\u fetchJobs():承诺{
log(“获取作业”);
让承诺:承诺=新承诺((决定,拒绝)=>{
this.props.deliveryJobService.getDeliveryJobs()
.然后((newJobs:IDeliveryJob[])=>{
log(“已获取作业,设置状态”);
这是我的国家({
工作:新工作
});
});
});
回报承诺;
}
问题是它停止设置状态,我看到的最后一个console.log是:

正在获取作业DeliveryJobService.ts:59 response.json:ƒ(){return this.nativeResponse.json()}DeliveryJobService.ts:63 response.value: (24) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}] TruckDeliverySchedule.tsx:已获取503个作业,正在设置状态

因此,看起来最后一个方法
\u fetchJobs()
没有返回其
承诺
,因此第一个方法可以调用
\u hideJobCreatePanel()


我对typescript/javascript开发相当陌生,我不明白为什么最后的
承诺没有得到回报。

你永远不会
解决
拒绝
-拒绝任何你的承诺,更重要的是,你陷入了把完美的承诺包装在自己的承诺中的境地

例如,与此相反:

private _fetchJobs(): Promise<void> {
    console.log("fetching jobs");
    let promise: Promise<void> = new Promise<void>((resolve, reject) => {
      this.props.deliveryJobService.getDeliveryJobs()
      .then((newJobs: IDeliveryJob[]) => {
        console.log("jobs fetched, setting state");
        this.setState ({
          jobs: newJobs
        });
      });  
    });

    return promise;
}

您的每个方法都应该返回承诺,而不是将其封装在新方法中,这样您的问题就不再存在了。。。更重要的是,您可以链接调用,这使代码更具可读性。

问题是您在不需要的地方使用Promise构造函数

private _fetchJobs(): Promise<void> {
      console.log("fetching jobs");
      return this.props.deliveryJobService.getDeliveryJobs().then((newJobs: IDeliveryJob[]) => {
         console.log("jobs fetched, setting state");
         this.setState ({
           jobs: newJobs
         });
       });

  }
private\u fetchJobs():承诺{
log(“获取作业”);
返回此.props.deliveryJobService.getDeliveryJobs()。然后((新作业:IDeliveryJob[])=>{
log(“已获取作业,设置状态”);
这是我的国家({
工作:新工作
});
});
}
 private _createJob(newJob: IDeliveryJob): Promise<void> {
    console.log("creating job");
    return this.props.deliveryJobService.createJob(newJob)
      .then(() => {
        console.log("job created, fetching jobs");
        return this._fetchJobs() // HERE!
          .then(() => {

          });
      });  
  }
private _fetchJobs(): Promise<void> {
      console.log("fetching jobs");
      return this.props.deliveryJobService.getDeliveryJobs().then((newJobs: IDeliveryJob[]) => {
         console.log("jobs fetched, setting state");
         this.setState ({
           jobs: newJobs
         });
       });

  }