2015-12-08 2 views
1

Есть ли способ привести params в тело Обещания, не зависимо от замыкания? Я предпочел бы не иметь, чтобы использовать var self = this;Как вы можете передать данные исполнителя Promise?

function Service(n) { 
    this.n = n; 
} 
Service.prototype = { 
    get: function (params) { 
     var self = this; 
     return new Promise(function(resolve, reject){ 
      if (params[self.n]) { 
       resolve("Service " + self.n); 
      } else { 
       reject("Service " + self.n); 
      } 
     }); 
    } 
} 
+0

с тегами es6, используйте функцию стрелки –

+0

Если ваша функция не асинхронная, зачем вы хотите вернуть обещание? –

+1

@hege_hegedus из-за интерфейса? – zerkms

ответ

3

Вы на самом деле можете вместо этого создают немедленно разрешить/отклоненных обещание вместо:

Service.prototype = { 
    get: function (params) { 
     if (params[this.n]) { 
      return Promise.resolve("Service " + this.n); 
     } 

     return Promise.reject("Service " + this.n); 
    } 
} 

Литература:

+0

Я думаю, что это именно то, что я хочу. Это в основном позволяет избежать правильного создания нового обещания? – zero298

+0

Ну, это создает обещание, но это уже разрешено с заданным значением. – zerkms

+0

Хорошо, и я все равно буду делать обещание с ** ** **. – zero298

3

Вы можете получить вокруг дополнительной var self = this с помощью функции стрелка.

От Arrow Function MDN:

An arrow function expression (also known as fat arrow function) has a shorter syntax compared to function expressions and lexically binds the this value (does not bind its own this, arguments, super, or new.target). Arrow functions are always anonymous.

Вот как это будет использоваться в вашем примере:

function Service(n) { 
    this.n = n; 
} 
Service.prototype = { 
    get: function (params) { 
     return new Promise((resolve, reject) => { 
      if (params[this.n]) { 
       resolve("Service " + this.n); 
      } else { 
       reject("Service " + this.n); 
      } 
     }); 
    } 
} 
+0

Это хорошо работает, но я бы предпочел не использовать функции стрелок в этом проекте. Может ли это быть выполнено с помощью функции function.bind() 'таким же образом? – zero298

+0

@ zero298 Замыкания лучше, чем bind, за исключением случаев, когда экземпляр класса с параметрами отдыха. 'new A (... args)' <=> 'new (A.bind.apply (A, [null] .concat ([args])))' –

3

Вы можете использовать ES7 async функции.

function Service(n) { 
    this.n = n; 
} 
Service.prototype = { 
    get: async function (params) { 
     if (params[this.n]) { 
      return "Service " + this.n; 
     } else { 
      throw "Service " + this.n; 
     } 
    } 
} 

Я думаю, что нет ничего плохого в закрытии. Этот код фактически преобразуется в код, основанный на закрытии.

Смежные вопросы