怎么解决promise只执行一次的问题

2018-09-29 01:49:23javascript问题

下面是一个简单的promise调用

new Promise(function(success,){
	setTimeout(function(){success()},1000);
}).then(function(){
	console.log(1)
});

可以看到,控制台能够输出1

Promise 的then方法可以做到回调功能,但是如果是这种情况呢?

function test(back){
	setInterval(function(){back()},1000)
}
test(function(){
	console.log(1);
});

//可以不停的输出1

而如果用promise做不到:

new Promise(function(success,){
	setInterval(function(){success()},1000);
}).then(function(){
	console.log(1)
});

Promise 除了then,catch还有隐藏的高级功能么?

热门评论:

  • 冯恒智 冯恒智 2018-9-29 4:14 回复:

    明明是两个一样的回答,一个被赞被采纳,一个被踩被忽略

网友回答:

  • 李十三 李十三 2018-9-29 2:31 回复:
    已被采纳

Promise 只能执行一次这一点是不会改变的
但是可以根据不同的业务来进行封装
重复调用 你可以每次重新声明一个Promise来调用

function p(){
  return new Promise(resolve =>{
    setTimeout(resolve,1000)
  }).then(()=>{
    console.log(1)
  })
}

setInterval(p,1000)


  • ____________qie ____________qie 2018-9-29 2:26 回复:

    题主没有给出应用的场景,简单说一下我的理解(也是小白兔阶段);
    首先个人认为题主看待Promise有一点点偏激,并非一切情况都要使用Promise的then,链式调用是为了解决异步的可读性和可维护性的问题,题主当前的情况完全可以return一个立即执行的fn(也就是用不上then关键字);
    其次,Promise是会有一些其他关键字,比如alljoin,map(这个不确定)等等,是适用不同情况的请求场景;
    最后,以上只是个人见解,可能因为学习所限会有理解错误和偏差,请题主权当参考.


  • Villee_ Villee_ 2018-9-29 2:19 回复:

    建议你先去多了解一下 Promise。
    Promise 本身只有三种状态,pending,resolved 和 rejected,而且状态只能是从 pending 转化为其他两种,而且不可重置,也就是说一个promise 只能转化一次状态,所以只用一个 Promise 是达不到你的要求的,每次执行完成之后再创建一个可以达到你的要求。

const cb = () => console.log(1)
const handler = () => new Promise(resolve => {
        setTimeout(() => {
            cb()
            resolve()
        }, 1000)
    }).then(handler)
handler()
  • jsoncode jsoncode 2018-9-29 2:20 回复:Villee_
    你这是万能的回复,不是答案。你是想说没有这个方法还是说我没有学会用到这个方法?我是想实现这种功能。

  • 冯恒智 冯恒智 2018-9-29 3:27 回复:Villee_

    怎么解决加号只能执行加法的问题?我想只用加号实现减法

  • 冯恒智 冯恒智 2018-9-29 3:31 回复:Villee_

    你创造力很丰富,可以考虑转行去做产品经理

  • Villee_ Villee_ 2018-9-30 9:38 回复:Villee_

    还 diss 我的答案?我之所以没直接回答,就是觉得你提的问题太 low 了,连 promise 基本的知识都不知道,先基本了解下再来提问题 OK ?来这里提问题不是都要人给你科普的,low B!