Javascript 本地饲料连锁店承诺

Javascript 本地饲料连锁店承诺,javascript,promise,localforage,Javascript,Promise,Localforage,我正在为承诺而挣扎。我通过.then().then().then().then().then().then().then().then().then().then().then().then()看到了事件链是如何发生的,但我不知道如何结束它。我希望我能做一个简单的: .then(callback(mydata)) 然而,我不能让它工作。我正在努力做到这一点 function doSomethingCallback(theArrayComesBackHere) { theArrayCo

我正在为承诺而挣扎。我通过
.then().then().then().then().then().then().then().then().then().then().then().then()
看到了事件链是如何发生的,但我不知道如何结束它。我希望我能做一个简单的:

 .then(callback(mydata))
然而,我不能让它工作。我正在努力做到这一点

function doSomethingCallback(theArrayComesBackHere) {
    theArrayComesBackHere.forEach(/*do stuff*/);
}    

button.onclick = () => {
   myobj.getlocalforagedata(doSomethingCallback);
}

myobj = {
   getlocalforagedata: (callback) => {
      var arr = [];
      localForage.keys().then((keys) => {
          keys.forEach((key) => {
              localForage.getItem(key).then(function (results) {
                  arr.push(results);
              });
          });
          callback && callback(arr);
      });
   }
}

请帮我摆脱这种疯狂。

[Edit]虽然还不错,但它返回的对象数组对于下一次使用几乎不可读(您需要一个循环来获取值),而且似乎忘记了
null
值,因此完整而巧妙的解决方案应该更像:

  const getLocalForageDataByKeys = () => {
    return localForage.keys().then(keys => {
      return Promise.all(keys.map(key => {
        return localForage.getItem(key)
          .then(value => {
            return { [key]: value }
          })
          .catch(error => {
            console.log(error)
            return { [key]: null }
          })
      })).then(arr => {
        return Object.assign(...arr)
      })
    })
  }
用法:

getLocalForageDataByKeys()
  .then(obj => {
    console.log(obj) // { keyA: 'valueA', keyB: 'valueB' }
  }).catch(error => {
    console.log(error) // do sth with error
  })
注意:

更妙的是,此解决方案使用的是高质量和高质量标准

更多信息:

getLocalForageDataByKeys()
  .then(obj => {
    console.log(obj) // { keyA: 'valueA', keyB: 'valueB' }
  }).catch(error => {
    console.log(error) // do sth with error
  })
带有
localfollow
的承诺示例:

使用承诺:

使用对象分配:


使用扩展运算符:

这个问题[以前]公认的答案是使用,这种做法使代码变得更加复杂和有缺陷

你可以更干净利落地完成你想做的事情,比如:

function getLocalForageData() {
    return localForage.keys().then(function (keys) {
        return Promise.all(keys.map(function (key) {
            return localForage.getItem(key);
        });
    });
}
用法示例:

getLocalForageData()
    .then(function (values) {
        console.log(values);
    })
    .catch(function (error) {
        console.error(error);
    });
上面获得的值数组与其各自的键不匹配。如果希望值与其键配对,可以执行以下操作:

function getLocalForageData() {
    return localForage.keys().then(function (keys) {
        return Promise.all(keys.map(function (key) {
            return localForage.getItem(key)
                .then(function (value) {
                    return { key: key, value: value };
                });
        }));
    });
}
或者您可以分解其中一个内部函数以减少嵌套:

function getLocalForageValueWithKey(key) {
    return localForage.getItem(key)
        .then(function (value) {
            return { key: key, value: value };
        });
}

function getLocalForageData() {
    return localForage.keys().then(function (keys) {
        return Promise.all(keys.map(getLocalForageValueWithKey));
    });
}

在任何一种情况下,调用和使用
getLocalForageData
函数的代码都与上述相同。

问题中的代码的几个功能是不必要的:

  • 新承诺(…)
    localfough.keys()
    返回构成承诺链根的承诺
  • 回调
    通过从
    getlocalforagedata()
    返回承诺,调用方可以链接
    getlocalforagedata()。然后(…)
    避免传递回调
  • 外部var
    arr
    正确构建的承诺链可以在没有任何外部变量的情况下收集和交付结果
以下是必要的:

  • 聚合由
    localfollow.getItem(key)
    返回的承诺,并从链中的该步骤返回承诺
  • 要执行测试,请在进一步链接的
    中执行
    if(err.length>0)
    if(arr.length>0)
    。然后()
    等待
    localfollow.getItem(key)
    承诺结算
试试这个:

myobj = {
    getlocalforagedata: () => {
        return localForage.keys()
        .then(keys => {
            // Use `keys.map(...)` to return an array of promises.
            // Then use `Promsie.all()` to aggregate the promises returned by `localForage.getItem(key)`.
            return Promise.all(keys.map(key => localForage.getItem(key)));
        })
        .then(arr => { // an array of results
            // These tests must be performed in a chained `then()`,
            // which will wait for all the individual `localForage.getItem(key)` results (or errors) to be delivered
            if (arr.length > 0) {
                return arr; // deliver a non-empty array
            } else {
                throw new Error('no results'); // throw error down the promise chain's error path.
            }
        });
    }
}
电话如下:

myobj.getlocalforagedata()
.then((results) => {
    // Work with results
})
.catch((error) => {
    // Do whatever with error.
    // Either return some default value or re-throw `error`
});

getlocalforagedata()
可以与回调一起使用,但更好的做法是返回承诺并允许调用方链接
getlocalforagedata()。然后(…)

不清楚,您希望函数中有承诺,对吗?我希望这个承诺返回单个对象。(老实说,我希望承诺不涉及其中。我从不使用它们,因为我似乎无法理解它们。但是,我正在使用LocalFough,它使用它们。我想让LocalFough做这件事,然后我构建一个要返回的对象)---希望这有助于实现所有功能的单个对象?是的,只有一个对象来自LocalFower的承诺。
LocalFower.getItem(key)。然后..
-
LocalStorage.get
不会返回一个
promise
。就是这样!!!非常感谢你。我会认真研究这个。非常感谢。不客气,承诺一开始理解起来很奇怪,但最后非常有用,但是
getlocalforagedata
应该是一个函数,而不是承诺。发布的内容对我来说是“连接点”,其余的我都能得到。我的首要问题是让那个数组脱离承诺。我将准备一个简单的示例并发布我的结果。希望它能帮助别人。哇!多谢。我会努力解决这个问题。我按照建议做了这些示例,除了缺少一个),它们工作得非常好。哇,哇,哇。关于承诺,我还有很多东西要学。@perl2go我想我已经修复了缺少的括号了。谢谢你指出这一点。一旦你掌握了窍门,承诺就是伟大的!