首页 > 解决方案 > 我怎样才能将这些 JavaScript 承诺重写为不那么复杂?

问题描述

我写了这个,但它看起来很粗糙,它用于节点 js,所以所有值都需要按顺序获取

import tripfind from '../model/tripfind';
import addbook from '../model/addbook';
import bookfind from '../model/bookfind';

function addBook(info) {

  return new Promise((resolve, reject) => {
    let rowcount = -1;
    bookfind(0, -1, -1).then((result) => {
      if (result) {
        rowcount = result.rowCount;
      } else {
        rowcount = 0;
      }
      tripfind(info.trip_id, 0).then((xresult) => {
        let val = '';
        if (xresult === 'false') {
          val = 'trip is not valid';
          resolve(val);
        } else {
          addbook(info, rowcount).then((value) => {
            if (value === 'invalid id') {
              resolve('invalid id');
            }
            resolve(value);
          }).catch((err) => {
            if (err) {
              reject(err);
            }
          });
        }
      }).catch((error) => {
        reject(error);
      });
    }).catch((err) => {
      if (err) {
        reject(err);
      }
    });
  });
}

export default addBook;

就是上面的代码,代码也被导出并作为promise函数处理,如果可以请帮忙

标签: javascriptnode.jsasynchronouspromise

解决方案


像这样?

function addBook(info) {
  return bookfind(0, -1, -1).then((result) => tripfind(info.trip_id, 0)
    .then((xresult) => (xresult === 'false') ? 
      'trip is not valid' : 
      addbook(info, result ? result.rowCount : 0)
    )
  );
}

或与async/await

async function addBook(info) {
  const result = await bookfind(0, -1, -1);

  const xresult = await tripfind(info.trip_id, 0)

  return xresult === "false"? 
    'trip is not valid' : 
    addbook(info, result ? result.rowCount : 0);
}

避免 Promise/Deferred 反模式:什么是明确的 Promise 构造反模式,我该如何避免?

并删除无意义/无用的代码,例如这个函数:

(value) => {
  if (value === 'invalid id') {
    resolve('invalid id');
  }
  resolve(value);
}

始终解决为value. 这就像return value === 1? 1: value

或者(error) => { reject(error); }只是将错误“转发”到返回的承诺。

或者这个构造

let rowcount = -1;

//....

  if (result) {
    rowcount = result.rowCount;
  } else {
    rowcount = 0;
  }

//....

doSomethingWith(rowcount)

可以概括为doSomethingWith(result ? result.rowCount : 0)


推荐阅读