Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将承诺代码转换为异步等待和模拟测试用例?_Javascript_Promise_Async Await - Fatal编程技术网

Javascript 将承诺代码转换为异步等待和模拟测试用例?

Javascript 将承诺代码转换为异步等待和模拟测试用例?,javascript,promise,async-await,Javascript,Promise,Async Await,如何将下面嵌套了promise和wait的函数转换为仅使用wait或仅使用promise const test = (url, id) => { return new Promise((_resolve, _reject) => { if (isValidUrl(url)) { let storage = new Storage(Indexdb, id); const cae = new valueExtract(url); cae.f

如何将下面嵌套了promise和wait的函数转换为仅使用wait或仅使用promise

const test = (url, id) => {
  return new Promise((_resolve, _reject) => {
    if (isValidUrl(url)) {
      let storage = new Storage(Indexdb, id);
      const cae = new valueExtract(url);
      cae.fetch()
        .then(data => {
          new zip(data)
            .then(obj => obj.getZip())
            .then(obj => obj.getList())
            .then(list => {
              return new Promise(async (resolve, reject) => {
                try {
                  let sI = storage.connection;
                  await Promise.all(Object.keys(list).map(async (fileName, index) => {
                    let blob = await new FileExtractor(list[fileName]);
                    await sI.setItemForce(
                      fileName,
                      new StoreObject(
                        fileName,
                        'testData',
                        blob
                      ).dataObject
                    )
                  }))
                  _resolve(sI);
                } catch (err) {
                  _reject(err)
                }
              })
            })
            .catch(err => _reject(err))
        })
        .catch(err => _reject(err))
    } else {
      _reject('Invalid URL')
    }
  })
};
我无法像我尝试的那样做,但它从未解决

const test = async (url, id) => {
  if (isValidUrl(url)) {
    try {
      let storage = new Storage(Indexdb, id);
      const cae = new valueExtract(url);
      const data = await cae.fetch();
      return new ZIPExtractor(data)
        .then(obj => obj.getZip())
        .then(obj => obj.getList())
        .then(list => {
          return async (resolve, reject) => {
            try {
              let sI = storage.connection;
              await Promise.all(Object.keys(list).map(async (fileName, index) => {
                let blob = await new FileExtractor(list[fileName]);
                await sI.setItemForce(
                  fileName,
                  new StoreObject(
                    fileName,
                    'testData',
                    blob
                  ).dataObject
                )
              }))
            } catch (err) {
              throw new Error(err)
            }
          }
        })
        .catch(err => _reject(err))
    } catch (e) {
      throw new Error('Invalid URL')
    }
  }
};
另外,我们如何为这类函数编写测试用例,以便我们不需要传入实际的网络url和开玩笑的mock。

它应该实现,但要使用
返回的
async(resolve,reject){…}
。你不应该在一开始就使用它,你可以忽略它:

const test = async (url, id) => {
  if (!isValidUrl(url)) {
    throw new Error('Invalid URL')
  }
  const storage = new Storage(Indexdb, id);
  const cae = new valueExtract(url);
  const data = await cae.fetch();
  const obj = await new ZIPExtractor(data); // shudder. A constructor should never return a promise
  const zip = await obj.getZip();
  const list = await zip.getList();
  const sI = storage.connection;
  await Promise.all(Object.keys(list).map(async (fileName, index) => {
    const blob = await new FileExtractor(list[fileName]);
    const store = new StoreObject(fileName, 'testData', blob);
    await sI.setItemForce(fileName, store.dataObject);
  }));
  return sI; // or something?
}

感谢您的快速回复,这意味着什么,
//可能需要一些
等待
s
,以及我们如何测试这种方法。。如果您添加这两个参数并解释一点不太擅长异步等待的逻辑,这将非常有用到多行等待。`const fileList=await obj.getZip();const list=wait fileList.getFileList();`它不起作用,我想我们忘了返回的是,如果你能解释一下单元测试的话,Soalway@Bergi非常感谢。对了,我就是这个意思。我还忘记了您想要返回一些原始代码中不清楚的内容。我认为如何测试这是一个问题,但可能您会想模拟所有构造函数,例如
存储
ZipExtractor
文件提取器
等。即使不使用异步/wait,您的承诺代码也可以简单得多。这里的嵌套完全没有必要,您应该避免
newpromise()