【问题标题】:How to make this piece of code asynchronous via promises?如何通过 Promise 使这段代码异步?
【发布时间】:2017-08-15 07:11:26
【问题描述】:

任何胶水。 请不要给出 SETTIMEOUT 的例子。

我的主管说,如果 then() 没有返回任何新的承诺,则没有必要有更多 then() 语句。我无法完全理解,我看过 Exploring ES6 但没有很好的例子我的情况。

let readData = new Promise(function (resolve, reject) {
    fs.readFile('/home/geek/Desktop/activity-logs.csv', 'utf8', (err, data) => {
        if (err)
            reject();
        resolve(data);

    });

});

readData
    .then((data) => {
        bankLogs = splitString(data, ';')
    })
    .then(() => {
        for (let index = 2; index < bankLogs.length; index += 5) {
            objectOfUsers[bankLogs[index]] = {}
            temporarySymbols.push(bankLogs[index].concat(bankLogs[index + 1]));
        }
        Object.keys(objectOfUsers).forEach(function (element) {
            objectKeys.push(element)
        });
        for (let index = 0; index < objectKeys.length; index++)
            createObject(index);
        console.log(objectOfUsers)
    })
    .catch((err) => console.log('Error happened : ' + err));

【问题讨论】:

  • 那么你的问题是什么?您的代码的哪一部分有问题?看来您已经使用了 Promise,而且它是异步的。
  • 第一个是.then((data) =&gt; { return splitString(data, ';') }) .then((bankLogs) =&gt; {。在那之后,你的代码让我很困惑。请解释你想做什么(包括为什么你只取每 5 个索引,例如)还包括一些样本数据和你正在使用的函数
  • 还有一件事。拥有更多不是不必要的。下一个then 工作,即使上一个then 没有回报。
  • 我多次使用 then() 语句,但他说没有必要,如果 then() 语句返回一个新的承诺。我无法得到它。此外,他说您应该在 then() 语句中使用局部变量而不是全局变量
  • 试试这个代码Promise.resolve().then(function() { console.log('promise1'); }).then(function() { console.log('promise2'); });你就会明白了。也许你的主管错了。

标签: javascript node.js ecmascript-6 es6-promise


【解决方案1】:

从您的代码 sn-p 中,您实现了 Promise 链,其中解决一个 Promise 会初始化并返回一个新的。

类似:

let readData = new Promise(/* ... */);

readData.then((data) => {
        let promise2 = new Promise(/* ... */);
        return promise2;
    }).then(() => {
        // ...
    })
    .catch((err) => console.log('Error happened : ' + err));

但是在解决readData之后,你只写了简单的逻辑,并没有新的承诺:bankLogs = splitString(data, ';')

应该是这样的:

let readData = new Promise(function (resolve, reject) {
    fs.readFile('/home/geek/Desktop/activity-logs.csv', 'utf8', (err, data) => {
        if (err)
            reject();
        resolve(data);    
    });    
});

readData.then((data) => {
    var bankLogs = splitString(data, ';')

    for (let index = 2; index < bankLogs.length; index += 5) {
        objectOfUsers[bankLogs[index]] = {}
        temporarySymbols.push(bankLogs[index].concat(bankLogs[index + 1]));
    }
    Object.keys(objectOfUsers).forEach(function (element) {
        objectKeys.push(element)
    });
    for (let index = 0; index < objectKeys.length; index++)
        createObject(index);
    console.log(objectOfUsers)
})
.catch((err) => console.log('Error happened : ' + err));

如果您仅在 Promise 中使用 bankLogs,请将其设为私有。


Promise 链 方法我们主要用于良好的代码可读性和为所有 Promise 处理一个错误回调。

编辑

您可以使用一些包装对象或项目列表(示例)通过 Promise 链传递值:

'use strict';

var fs = require('fs');

let readData = new Promise(function (resolve, reject) {
    fs.readFile('/Users/maxim/Appsflyer/projects/ZEVEL/file1.txt', 'utf8', (err, data) => {
        if (err)
            reject();

        var obj = {
            data: data,
            bankLogs: {} // in 1st Promise initialize bankLogs
        };    
        resolve(obj);    
    });    
});

// 2nd dummy Promise 
let newReadData = new Promise(function (resolve, reject) {
    fs.readFile('/Users/maxim/Appsflyer/projects/ZEVEL/file2.txt', 'utf8', (err, data) => {
        if (err)
            reject();
        resolve(data);

    });

});

readData.then((obj1) => {   

    obj1.bankLogs.value = "someValue";

    return newReadData.then(function(data2){       
        obj1.data2 = data2;
        return obj1;
    });
}).then((dataTotal) => {   
    console.log(dataTotal);

})
.catch((err) => console.log('Error happened : ' + err));

【讨论】:

  • 我不只在一个承诺中使用 bankLogs,而是在代码的其他部分使用它。因此,我将其声明为全局变量,但主管说,与其将其设为全局变量,不如使用局部变量和通过承诺链来实现。但是我没有任何例子,(实际上所有例子都是SETTIMEOUT,但它与mmy的情况不同。)顺便谢谢你对我的关心。
猜你喜欢
  • 1970-01-01
  • 2018-05-03
  • 2015-10-24
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
相关资源
最近更新 更多