JS Promise

比如说要打印当前目录下a.txt b.txt c.txt种的内容,直接用读文件(回调)的方式来依次调用时存在问题的

 

无法保证输出顺序:

var fs = require("fs")

fs.readFile('./a.txt', 'utf8', function(error, data){
    if(error){
        return console.log(error)
    }
    console.log(data)
})

fs.readFile('./b.txt', 'utf8', function(error, data){
    if(error){
        return console.log(error)
    }
    console.log(data)
})


fs.readFile('./c.txt', 'utf8', function(error, data){
    if(error){
        return console.log(error)
    }
    console.log(data)
})

 

要解决这个问题,可以把方法嵌套起来,但这是不好的,会陷入“回调地狱”中

var fs = require("fs")

fs.readFile('./a.txt', 'utf8', function(error, data){
    if(error){
        return console.log(error)
    }
    console.log(data)
    fs.readFile('./b.txt', 'utf8', function(error, data){
        if(error){
            return console.log(error)
        }
        console.log(data)
        fs.readFile('./c.txt', 'utf8', function(error, data){
            if(error){
                return console.log(error)
            }
            console.log(data)
        })
    })
})

 

这种情况,可以用Promise解决。

 

Promise基本语法:

var fs = require("fs")

// Promise一旦new出来,就立即执行里面封装的代码
var p1 = new Promise(function(resolve, reject){
    fs.readFile('./a.txt', 'utf8', function(error, data){
        if(error){
            // 承诺容器中的任务失败了,把容器的 Pending 状态变为 Reject
            reject(error)
        }else{
            // 承诺容器中的任务成功了,把容器的 Pending 状态变为 Resolve
            resolve(data)
        }
    })
})
// Promise执行完毕,就执行then方法
// then方法参数里的两个匿名function就是Promise里的resolve, reject参数
p1.then(
        function(data){console.log(data)},
        function(error){console.log(error)}
    )

 

解决方法:

var fs = require("fs")

var p1 = new Promise(function(resolve, reject){
    fs.readFile('./a.txt', 'utf8', function(error, data){
        if(error){
            reject(error)
        }else{
            resolve(data)
        }
    })
})

var p2 = new Promise(function(resolve, reject){
    fs.readFile('./b.txt', 'utf8', function(error, data){
        if(error){
            reject(error)
        }else{
            resolve(data)
        }
    })
})

var p3 = new Promise(function(resolve, reject){
    fs.readFile('./c.txt', 'utf8', function(error, data){
        if(error){
            reject(error)
        }else{
            resolve(data)
        }
    })
})

p1.then(
    function(data){
        console.log(data)
        // 该方法可以return一个值,这个值会传递给下一个then的function的参数中
        // 当 return 123, 后面就接收到123
        // 当 return hello, 后面就接收hello
        // 特别的,可以return一个Promise对象,比如说p2,这种就和return简单数据不一样了
        // 当 return p2的时候,后面的then其实就是p2的then
        return p2
    },
    function(error){
        console.log(error)
        return p2
    }
).then(
    function(data){
        console.log(data)
        return p3
    },
    function(error){
        console.log(error)
        return p3
    }
).then(
    function(data){
        console.log(data)
    },
    function(error){
        console.log(error)
    }
)

 

这段代码还可以封装下

var fs = require("fs")

function readFile(filePath){
    return new Promise(function(resolve, reject){
        fs.readFile(filePath, 'utf8', function(error, data){
            if(error){
                reject(error)
            }else{
                resolve(data)
            }
        })
    })
}

p1 = readFile('./a.txt')
p2 = readFile('./b.txt')
p3 = readFile('./c.txt')

p1.then(
    function(data){
        console.log(data)
        return p2
    },
    function(error){
        console.log(error)
        return p2
    }
).then(
    function(data){
        console.log(data)
        return p3
    },
    function(error){
        console.log(error)
        return p3
    }
).then(
    function(data){
        console.log(data)
    },
    function(error){
        console.log(error)
    }
)

  

 

转载于:https://www.cnblogs.com/413xiaol/p/11087211.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript Promise是一种用于处理异步操作的对象。它可以解决回调地狱问题,并提供了一种更加优雅和可读的方式来处理异步代码。Promise对象有三个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。引用中提到了Promise的用法详解,可以作为参考。 在引用中的例子中,可以看到Promise的执行是异步的。通过创建一个Promise对象,并在其构造函数中传入一个执行器函数(resolve和reject函数),可以在函数内部执行异步操作。当异步操作完成后,可以通过调用resolve函数将结果传递给then方法的成功回调函数。 在引用中的例子中,定义了一个greet函数,该函数返回一个Promise对象。在Promise的构造函数中,可以通过调用resolve函数来将结果传递给then方法的成功回调函数。在调用greet函数后,可以通过调用then方法来获取Promise对象的结果。在示例中,打印出了Promise对象(p)和成功回调函数(v)的结果。 总之,JavaScript Promise是一种用于处理异步操作的对象,可以通过调用resolve函数将结果传递给then方法的回调函数。它提供了一种优雅的方式来处理异步代码,避免了回调地狱问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [js中的promise详解](https://blog.csdn.net/zyf971020/article/details/127015351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Javascript Promise用法详解](https://download.csdn.net/download/weixin_38538312/12957140)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值