разрешенное обещание возвращает неопределенное значение, хотя оно имеет значение - PullRequest
0 голосов
/ 09 января 2020

У меня неприятная проблема, и я не могу понять, почему это происходит

У меня есть следующая функция:

  public async PageResult(searchRecord:Search,authorization:string,pageNumber:number,databaseName:string){

    some codes .....
    return new Promise((resolve, reject) => {
      this._resultsDatastore.bulkInsert(
        databaseName,
        objects
      ).then(succ => {
        // I can see succ is printed successfully in console
        console.log(succ);
        // when I resolve it here I assume I am returning the result
        resolve(succ)
      }, err => {
        console.log(err);
        reject(err)
      })
    })
  }

Итак, как вы можете видеть, я разрешаю (su cc ) и таким образом я возвращаю su cc функции вызывающей стороны

Теперь у меня есть:

 public async loadResults(
    searchId: string,
    authorization: string
  ) {

   some code....
    const results = udsQuery.pages.map(async (pageNumber: number) => await this.PageResult(searchRecord,authorization,pageNumber,databaseName))


    let all: any=[];
    await Promise.all(results).catch(e => {
      console.log("^^^^^^^^^^^^^^^^^^^^^EEEERRRRRROR^^^^^^^^^^^^^^^^^^^^^^");
    }).then(res=>{
      console.log("suuuuuuuuuuuuuuucesssssssssssssss");
      // issue is here: below prints undefined though succ has value 
      console.log(res);
      all.push(res);
      return res;
    });

  }

Итак, теперь я вызываю PageResult на карте и использую promis.all для восстановите его вместо su cc, который я возвратил в PageResult. Я получаю неопределенное значение. См. этот раздел в приведенном выше коде:

  console.log("suuuuuuuuuuuuuuucesssssssssssssss");
  // issue is here: below prints undefined though succ has value 
  console.log(res);

Я что-то упустил?

1 Ответ

0 голосов
/ 10 января 2020

Почему-то мне не понравилось, как вы написали код, я сначала попытался изменить этот код. Еще одна ошибка, которую я вижу, вы выполняете свою функцию PageResult() до того, как выполнить ее, вместо этого она должна выполняться блоком Promise.all.

Я не проверял код, но так и должно быть:

 public async PageResult(searchRecord:Search,authorization:string,pageNumber:number,databaseName:string){

        try
        {
            const succ =  await this._resultsDatastore.bulkInsert(
                databaseName,
                objects);
            return succ;
        }
        catch (e)
        {
            throw e;
        }
    }


    public loadResults(searchId: string, authorization: string )
    {   
        const all: any=[];
        const pormises: any=[];
        const results = udsQuery.pages.map((pageNumber: number) =>
            pormises.push(this.PageResult(searchRecord, authorization, pageNumber, databaseName)));

        return new Promise((resolve, reject) =>
        {
            Promise.all(results)
                .then(res=>
                {
                    console.log("suuuuuuuuuuuuuuucesssssssssssssss");
                    // issue is here: below prints undefined though succ has value

                    console.log(res);
                    all.push(res);

                    return resolve(all);
                })
            .catch(e =>
            {
                console.log("^^^^^^^^^^^^^^^^^^^^^EEEERRRRRROR^^^^^^^^^^^^^^^^^^^^^^");
            });
        });

    }
...