2017-02-17 6 views
0

У меня есть два файла в папке - index.js и util.js с их базы кода следующим образомНеожиданные переменные аргументы [] при прохождении функции

util.js

let obj = {} 
obj.sendTransaction =() => { 
    console.log(arguments); 
    return new Promise((resolve, reject) => { 
    // try { 
    // let data = ethFunction.call() 
    // resolve(data) 
    // } catch (e) { 
    // reject(e) 
    // } 
    }); 
} 
module.exports = obj 

В Index.js, если я прохожу аргументы addNewParticipant или его изменения, то они не превращаются в аргументы объекта в util.js, например

const addNewParticipant = (foo, bar) => { 
    var ethFunction = myContract.addParticipant.sendTransaction 
    console.log(ethFunction); 
    EthUtil.sendTransaction() 
} 

const addNewParticipantTwo = (foo, bar) => { 
    var ethFunction = myContract.addParticipant.sendTransaction 
    console.log(ethFunction); 
    EthUtil.sendTransaction(ethFunction, foo, bar) 
} 

и называть его addNewParticpant(1, 2) и, addNewParticpantNew(1, 2) номерами 1 и 2 не отображаются в объекте arguments в функции util. На самом деле, аргументы объект остается таким же, 4 входа, описывающие некоторые функции и файлы в node_modules включая Bluebird и ссылкой на index.js самого


Моя конечная цель заключается в

  1. Передайте функцию от index.js к util.js

  2. Pass по неизвестному числу переменных

  3. Вызов переданной функции и применить неизвестное число переменных к нему

  4. обернуть все это в обещании и сделать некоторые проверки данных

В идеале arguments[0] будет представлять собой функцию, я бы передать и другой - значения. Я бы затем использовать

var result = arguments[0].apply(null, Array().slice.call(arguments, 1)); 

Если это поможет, то функции я хочу передать имеет дополнительную функцию обратного вызова

+1

жирные стрелки не имеют собственного объекта 'this' или' arguments'. Если вы этого хотите, вам придется использовать «обычные функции». или вы используете параметр [rest parameter] (// developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/rest_parameters) 'obj.sendTransaction = (fn, ... args) => {console.log (fn, args)} ' – Thomas

+0

И, пожалуйста, прекратите рассылку тегов, этот вопрос не имеет ничего общего с nodejs, прототипом или prototypejs – Thomas

ответ

1

Как уже упоминался в комментариях, жирные стрелки не имеют свои собственные this или arguments объектов. Объект arguments, который вы регистрируете, - это функция, созданная загрузчиком модуля, и его переданные аргументы.

Вы можете использовать «обычную функцию», или в этом случае, вы можете использовать ...rest parameter

И избежать отсроченной антипаттерн.

//first a little utility that might be handy in different places: 
//casts/converts a value to a promise, 
//unlike Promise.resolve, passed functions are executed 
var promise = function(value){ 
    return typeof value === "function"? 
     this.then(value): 
     Promise.resolve(value); 
}.bind(Promise.resolve()); 

module.exports = { 
    sendTransaction(fn, ...args){ 
     return promise(() => fn.apply(null, args)); 
    } 
} 
+0

Спасибо, я поменял его на обычную функцию и использовал применить. Просто закончил все тесты, но первые несколько прошли. В соответствии с этим http://bluebirdjs.com/docs/anti-patterns.html, отсроченный анти-шаблон - это когда вместо избыточного первоначального обещания используется «избыточная упаковка». Я немного новичок в Promises, поэтому не знаю, почему мой код является анти-шаблоном.Если вы могли бы указать на это, спасибо –

+0

@VarunAgarwal из-за многословной и imo ненужной 'новой оболочки Promise()', в то время как каждая 'resolvedPromise.then()' выполняет задание; даже обрабатывая отклоняемую часть. Но это всего лишь второстепенный момент. – Thomas

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